/**
 * @file    drv_lin.h
 * @author  yhy
 * @brief   芯必达IM94x系列芯片, lin抽象层
 * @version 1.03
 * @date    2025-07-15
 *
 * @copyright Copyright (c) 2025
 *
 * @details
 * Change Logs:
 * Date           Author       Notes
 * 2025-07-15     yhy          the first version V1.00
 * 2025-07-17     yhy          新增lin主机模块 V1.01
 * 2025-07-18     yhy          主机新增帧间隔 V1.02
 * 2025-08-22     yhy          新增lin主机模式下超时检测 V1.03
 *
 */
#ifndef __DRV_LIN_H__
#define __DRV_LIN_H__

#include "common_config.h"

#include <stdbool.h>
#include <stdint.h>
#include <string.h>

#define LIN_SCHEDULER_MAXIZE 10U /* LIN调度器最大数量 */

typedef void (*lin_callback_f)(uint32_t instance, void *param);

/**
 * @brief LIN实例
 *
 */
typedef enum
{
    LIN_INSTANCE_UART0_0 = 0U,  /*!< UART0 Tx: PC3, Rx: PC2 */
    LIN_INSTANCE_UART0_1 = 1U,  /*!< UART0 Tx: PB1, Rx: PB0 */
    LIN_INSTANCE_UART0_2 = 2U,  /*!< UART0 Tx: PC9, Rx: PC8 */
    LIN_INSTANCE_UART1_0 = 3U,  /*!< UART1 Tx: PA1, Rx: PA0 */
    LIN_INSTANCE_UART1_1 = 4U,  /*!< UART1 Tx: PE5, Rx: PE4 */
    LIN_INSTANCE_UART1_2 = 5U,  /*!< UART1 Tx: PA3, Rx: PA2 */
    LIN_INSTANCE_UART1_3 = 6U,  /*!< UART1 Tx: PA11, Rx: PA10 */
    LIN_INSTANCE_UART2_0 = 7U,  /*!< UART2 Tx: PD7, Rx: PD6 */
    LIN_INSTANCE_UART2_1 = 8U,  /*!< UART2 Tx: PD1, Rx: PD0 */
    LIN_INSTANCE_UART2_2 = 9U,  /*!< UART2 Tx: PC9, Rx: PC8 */
    LIN_INSTANCE_UART2_3 = 10U, /*!< UART2 Tx: PC7, Rx: PC6 */
    LIN_INSTANCE_MAX,
} snf_lin_instance_e;

/**
 * @brief LIN传输类型
 *
 */
typedef enum
{
    LIN_TRANSFER_TYPE_SEND = 0U, /*!< LIN发送 */
    LIN_TRANSFER_TYPE_RECV = 1U, /*!< LIN接收 */
    LIN_TRANSFER_TYPE_MAX,
} snf_lin_transfer_type_e;

/**
 * @brief LIN传输模式
 *
 */
typedef enum
{
    LIN_TRANSFER_MODE_SLAVE  = 0U, /*!< LIN从机模式 */
    LIN_TRANSFER_MODE_MASTER = 1U, /*!< LIN主机模式 */
    LIN_TRANSFER_MODE_MAX,
} snf_lin_transfer_mode_e;

/**
 * @brief LIN调度器, 最大数量为10个
 *
 */
typedef struct
{
    uint8_t                 id;            /*!< LIN ID */
    snf_lin_transfer_type_e transfer_type; /*!< LIN传输类型 */
    uint8_t                *data;          /*!< LIN数据 */
    uint8_t                 data_len;      /*!< LIN数据长度 */
    void (*callback)(void);                /*!< 回调函数 */
} snf_lin_scheduler_t;

/**
 * @brief LIN配置结构体
 *
 */
typedef struct
{
    snf_lin_instance_e      instance;      /*!< LIN实例 */
    snf_lin_transfer_mode_e transfer_mode; /*!< LIN传输模式 */
    uint16_t resp_timeout; /*!< LIN从机响应超时时间(跟调度snf_drv_lin_transfer的超时时间相关)  */
} snf_lin_config_t;

result_e snf_drv_lin_init(const snf_lin_config_t *lin_config);
result_e snf_drv_lin_register_scheduler(const snf_lin_scheduler_t *scheduler_list, uint8_t list_size);
result_e snf_drv_lin_transfer(void);

#endif
